package cn.fansunion.concurrent.volatile2;

import java.util.concurrent.TimeUnit;

//先看一下这个程序，这个程序就是在main方法中开了一个子线程，然后根据stop来判断是否停止，stop这变量的值初始为false，后来在主线程中被改为true。那么大家判断一下这个子线程多久会停止？
//实际上他不会停止，这个stop变量就是一个共享变量，我们刚才说了，共享变量其实会在每个线程中拷贝成一个私有变量，在这个代码里主变量更改的true其实是主线程中的stop，而子线程并没有接收到这个改变。
//也就是说这个改变对于子线程是不可见的。
//那怎样才能让这个程序正确运行呢？最简单的方法就是使用volatile关键字，让这个共享变量的改变能够可见。这样子线程接收到stop变量的改变后，就会正常结束运行了。
//这就带出了一个知识点“volatile关键字能够，也仅能够保证线程之间的可见性！”为什么强调仅能够呢？大家来看下一个例子。
//volatile，适用于1写多读
public class MultiThreadActivity {

	private static boolean stop = false;

	public static void main(String[] args) throws InterruptedException {
		new Thread(new Runnable() {

			@Override
			public void run() {
				int i = 0;
				while(!stop){
					i++;
				}
				
			}

		}).start();
		TimeUnit.SECONDS.sleep(1);
		stop=true;
	}

}
